package com.bjpowernode.javase.array;
/*ctrl + P 看参数
    1、main方法中的(String[] args)
        JVM调用main方法，会自动传一个String数组过来
    2、数组中多态的应用
    3、关于一维数组的扩容
        在java开发中，数组长度一旦确定不可变，因此在有需要的时候进行扩容
        扩容：先创建一个大容量的数组，然后将小容量数组中的数据一个一个拷贝到大数组中。
        效率较低，建议尽可能的少扩容


 */
public class ArrayTest02 {
    public static void main(String[] args) {
        //JVM默认传递过来的这个数组对象的长度默认为0
        //这个数组是留给用户，在控制台上输入参数，这个参数自动转化成String[] args
        //运行——编辑配置——程序参数
        System.out.println("数组长度："+ args.length);

        //main方法中的(String[] args)
        for(int i = 0 ; i < args.length ; i++){
            System.out.println(args[i]);
        }

        //数组中多态的应用
        Animals[] animals = {new Cat() , new Bird() , new Bird() , new Cat() };  //父类型引用指向子类型对象，向上转型
        for ( int i = 0 ; i < animals.length ; i++){
            animals[i].move();
            if(animals[i] instanceof Cat){
                Cat c = (Cat)animals[i];           //强制类型转换，向下转型
                c.CatchMouse();
            }else if(animals[i] instanceof Bird){
                Bird b = (Bird)animals[i];
                b.Sing();
            }
        }

        //一维数组的扩容与拷贝
        int[] src = {1 , 11 , 22 , 3 , 4}; //拷贝源
        int[] dest = new int[20]; //拷贝目标
        System.arraycopy(src, 1 ,dest ,3 , 2); //调用方法
        // 拷贝源，源中第几个参数开始，拷贝目标，拷到第几个位置，拷贝长度
        for (int i = 0; i < dest.length; i++) {
            System.out.println(dest[i]);
        }

    }
}

class Animals{
    public void move(){
        System.out.println("动物在移动");
    }
}

class Cat extends Animals{
    public void move(){
        System.out.println("猫走猫步");
    }
    public void CatchMouse(){
        System.out.println("猫抓老鼠");
    }
}

class Bird extends Animals{
    public void move(){
        System.out.println("鸟飞");
    }
    public void Sing(){
        System.out.println("鸟唱歌");
    }
}